4.2.2 背包问题 组合优化的问题

猛一看是有些难度的,其实不算特别难

主要看了 JS 基于贪心算法解决背包问题示例

大致明白了

部分背包问题:固定容积的背包能放入物品的总最大价值 : 按比例降序尽可能多放入物品

物品            A B C D 
价格            50 220 60 60 
尺寸            5 20 10 12 
-----------------
比率(价格/尺寸) 10 11 6 5
1
2
3
4
5
6
7

算法分析:

function greedy(values, weights, capacity){
  var returnValue = 0
  var remainCapacity = capacity
  var sortArray = []
  values.map((cur, index) =>{
    sortArray.push({
      'value': values[index],
      'weight': weights[index],
      'ratio': values[index]/weights[index]
    })
  })

  // 按照价值比降序排序
  sortArray.sort(function(a, b){
    return b.ratio - a.ratio
  })
  console.log(sortArray)
  //[{value: 220, weight: 20, ratio: 11},
  // {value: 50, weight: 5, ratio: 10},
  // {value: 60, weight: 10, ratio: 6},
  // {value: 60, weight: 12, ratio: 5}]
  
 // 每次放一个,总容积都减掉一个的重量,计算总价值
 sortArray.map((cur,index) => {
    var num = parseInt(remainCapacity/cur.weight); // 计算每个物品可以放几个
    console.log(num)
    remainCapacity -= num*cur.weight; // 放一个,剩余容积 = 总容积- 已放物品的
    returnValue += num*cur.value;    // 计算总价值
  })
  return returnValue
}


var items = ['A','B','C','D']
var values = [50,220,60,60]
var weights = [5,20,10,12]
var capacity = 32 //背包容积
greedy(values, weights, capacity) // 320
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

参考